/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

/*
开关部件单数值部件绘制使用共用背景图形,矢量部件单独使用widget组进行绘制和调整.
*/

#include "B_场景管理/操作记录.h"

#include <UI/UI.h>
#include <节点/节点.h>

#include <stack>




typedef enum {
	e_属性对象_空,
	e_属性对象_3D视口,
	e_属性对象_节点面板,
	e_属性对象_节点视口,
	e_属性对象_视频视口,
	e_属性对象_纹理视口,
	e_属性对象_曲线视口,
	e_属性对象_关键帧视口,
}E_属性操作对象类型;

typedef struct {
	E_属性操作对象类型	m_Type;
	S_结构指针		m_Obj;
}S_属性操作对象;



typedef void(*fp_属性栏面板_部件构建)(class C_属性栏* panel, S_结构指针 obj);


class S_组件池_ {

public:
	//struct S_组件缓存 {
	//	std::vector<C_Widget*>	m_widget;
	//	uint32					m_使用计数 = 0;
	//};
	std::map<E_值类型, std::set<C_Widget*>>	m_组件集;
	
	//E_值类型				m_类型;
	S_组件池_();
	C_Widget* f_get(S_UI渲染环境* ctx, E_值类型 类型);
	//void f_归还组件(C_Widget* w);

};

struct S_组件池集合 {
	//S_UI创建环境* m_Ctx;
	std::map<uint32, S_组件池_>	m_不同设备组件池;

	S_组件池集合();
	C_Widget*	f_get(S_UI渲染环境* ctx, S_Props& prop);
	void		f_归还组件(uint32 全局设备ID, uint32 num, C_Widget** ws);
};


class C_工具视口部件容器 {
public:
	C_工具视口部件容器();

	uint32					m_分组框使用计数;
	uint32					m_字符使用计数;
	uint32					m_按钮使用计数;
	uint32					m_开关使用计数;
	uint32					m_标签使用计数;
	uint32					m_枚举使用计数;
	uint32					m_矢量使用计数;
	uint32					m_路径使用计数;
	uint32					m_多选框使用计数;
	uint32					m_列表框使用计数;
	uint32					m_超级列表编辑框计数;
	uint32					m_插座列表框使用计数;
	uint32					m_拾色器使用计数;
	uint32					m_曲线采样器使用计数;
	uint32					m_纹理使用计数;
	uint32					m_物体组使用计数;


	uint32					m_单值ui使用计数;
	uint32					m_按钮开关绘制数量;

	std::vector<C_Widget*>	m_分组框;
	std::vector<C_Widget*>	m_字符部件;
	std::vector<C_Widget*>	m_路径部件;
	std::vector<C_Widget*>	m_单数值_部件;
	std::vector<C_Widget*>	m_vec2_部件;
	std::vector<C_Widget*>	m_vecf_部件;
	std::vector<C_Widget*>	m_vec4_部件;
	std::vector<C_Widget*>	m_多选框_部件;
	std::vector<C_Widget*>	m_列表框_部件;
	std::vector<C_Widget*>	m_插座列表框_部件;
	std::vector<C_Widget*>	m_拾色器_部件;
	std::vector<C_Widget*>	m_曲线采样器_部件;
	std::vector<C_Widget*>	m_纹理_部件;
	std::vector<C_Widget*>	m_物体组_部件;

	std::vector<C_Widget*>	m_超级列表编辑框_组件;


	std::vector<C_Widget*>	m_行文本编辑框部件;
	uint32					m_行文本编辑框使用计数;

	uint32					m_vec2使用计数;
	uint32					m_uVec2使用计数;
	//用于部件构建记录  不能用于GPU内存偏移计算
	uint32					m_vecf使用计数;
	uint32					m_vec4使用计数;

	//矢量部件总数 用于GPU内存偏移
	uint32					m_vec全部分量使用计数;




	std::vector<S_Props>			m_属性;

	ui_绘制模板_行文本绘制			m_名称标签;
	ui_绘制模板_行文本绘制			m_准备废弃_组件内文本;
	ui_绘制模板_行文本绘制			m_组件内文本;
	
};




class C_属性栏视口 : public C_Widget, public C_工具视口部件容器 {

protected:
	void f_重新构建组件(std::vector<S_Props>& newProp);

public:
	C_属性栏视口(S_UI渲染环境& ctx);
	~C_属性栏视口();

	C_Widget* m_手柄;

	E_方向			m_布局方向;
	float32			m_滚动量;
	


	S_Surface2D* m_背景;
	S_Surface2D* m_字符;
	S_Surface2D* m_图标;

	
	void f_打开();
	void f_关闭();

	
	void f_构建属性部件(const std::vector<S_Props>& newProp);
	void f_切换方向(E_方向 方向);

};



class C_属性栏 : public C_Widget {

public:
	C_属性栏(S_UI渲染环境& ctx);

	C_Widget*		m_滚动窗口;
	C_属性栏视口*	m_View;

	void f_打开();
	void f_关闭();
	void f_设置宽度(float32 w);

	void f_构建属性部件(const std::vector<S_Props>& newProp);
	void f_属性更新到组件();

};

class C_状态条 : public C_属性栏视口 {

public:
	C_状态条(S_UI渲染环境& ctx);

	void f_构建属性部件(const std::vector<S_Props>& newProp, C_状态条* 分身);
	S_Props& f_get属性(uint16 offset);

};







C_属性栏* f_创建属性边栏(S_UI渲染环境& ctx);
//C_属性栏面板* f_取属性边栏(C_Widget* 滚动窗口);
//C_属性栏* f_取属性边栏(C_Widget* 滚动窗口);

void f_属性栏_初始化();
void f_属性栏_清理();


void f_属性栏_刷新属性绘制();


